﻿using System.Data.SqlClient;
using System.Data;
using System.Windows.Forms;
using System;
using System.Collections.Generic;

namespace 共享单车管理系统
{
    public partial class guihuandanche : Form
    {
        public guihuandanche()
        {
            InitializeComponent();
        }

        SqlDataAdapter daShop11; // 定义一个用于填充 shop11 表信息的数据适配器
        DataSet ds = new DataSet(); // 定义一个数据集，用于存储数据

        void init()
        {
            // 初始化方法，用于获取购物车信息和产品信息
            string str = "select userid,shopid,BikeID,dancheleixing,jiage,qty,T,TT,S from shop11 where UserID=" + Convert.ToInt32(Login.UserID) + "";
            // 获取购物车信息的 SQL 查询语句
            daShop11 = new SqlDataAdapter(str, DB.cn); // 初始化 shop11 数据适配器
            daShop11.Fill(ds, "shop11"); // 填充 shop11 信息到数据集中的 shop11 表



            
        }

        void Bind()
        {
            // 数据绑定方法，将 shop11 表信息绑定到 DataGridView 中显示
            DataView dgvShop11 = new DataView(ds.Tables["shop11"]); // 创建一个 DataView 对象用于显示 shop11 表信息
            dgv.DataSource = dgvShop11; // 将 DataView 绑定到 DataGridView 中
            dgvHead(); // 设置 DataGridView 的列名

            // 确保只添加一次复选框列
            if (!dgv.Columns.Contains("acCode"))
            {
                showx2(); // 显示选择列
            }
        }

        void showx2()
        {
            // 显示选择列
            DataGridViewCheckBoxColumn acCode1 = new DataGridViewCheckBoxColumn();
            acCode1.Name = "acCode";
            acCode1.HeaderText = "选择还车";
            dgv.Columns.Add(acCode1); // 将选择列添加到 DataGridView 中
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        void dgvHead()
        {
            // 设置 DataGridView 的列名
            dgv.Columns[0].HeaderText = "用户编号";
            dgv.Columns[1].HeaderText = "购物车编号";
            dgv.Columns[2].HeaderText = "单车编号";
            dgv.Columns[3].HeaderText = "单车类型";
            dgv.Columns[4].HeaderText = "价格";
            dgv.Columns[5].HeaderText = "购买数量";
            dgv.Columns[6].HeaderText = "下单时间";
            dgv.Columns[7].HeaderText = "结算时间";
            dgv.Columns[8].HeaderText = "费用";







        }

        private void guihuandanche_Load(object sender, EventArgs e)
        {
            DB.GetCn(); // 连接数据库
            init(); // 初始化数据
            Bind(); // 数据绑定
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 检查是否有单车被选中
            bool hasSelected = false;
            foreach (DataGridViewRow row in dgv.Rows)
            {
                DataGridViewCheckBoxCell checkBoxCell = row.Cells["acCode"] as DataGridViewCheckBoxCell;
                if (checkBoxCell != null && checkBoxCell.Value != null && (bool)checkBoxCell.Value)
                {
                    hasSelected = true;

                    // 检查被选中的单车所有数据列的值是否不为空
                    bool allFieldsNotEmpty = true;
                    for (int i = 0; i < row.Cells.Count; i++)
                    {
                        // 排除复选框列
                        if (row.Cells[i].OwningColumn.Name == "acCode")
                            continue;

                        // 如果单元格为空，则设置标志为false
                        if (row.Cells[i].Value == null || string.IsNullOrEmpty(row.Cells[i].Value.ToString()))
                        {
                            allFieldsNotEmpty = false;
                            MessageBox.Show("被选中的单车中有必填项未填写，请检查所有列。");
                            return; // 退出方法
                        }
                    }

                    if (allFieldsNotEmpty)
                    {
                        // 如果所有字段都不为空，则执行还车操作
                        // 此处放置您的还车逻辑代码
                        // 例如：
                        int bikeID = Convert.ToInt32(row.Cells["BikeID"].Value);
                        int qty = Convert.ToInt32(row.Cells["qty"].Value);
                        int shopID = Convert.ToInt32(row.Cells["shopid"].Value);

                        // 更新单车表库存
                        string updateBikeSql = "UPDATE Bike SET kucun = kucun + @qty WHERE BikeID = @bikeID";
                        using (SqlCommand updateCmd = new SqlCommand(updateBikeSql, DB.cn))
                        {
                            updateCmd.Parameters.AddWithValue("@qty", qty);
                            updateCmd.Parameters.AddWithValue("@bikeID", bikeID);
                            updateCmd.ExecuteNonQuery();
                        }

                        // 删除 shop11 表中的对应记录
                        string deleteShop11Sql = "DELETE FROM shop11 WHERE shopid = @shopID";
                        using (SqlCommand deleteCmd = new SqlCommand(deleteShop11Sql, DB.cn))
                        {
                            deleteCmd.Parameters.AddWithValue("@shopID", shopID);
                            deleteCmd.ExecuteNonQuery();
                        }
                    }
                }
            }

            if (!hasSelected)
            {
                MessageBox.Show("请选择要还车的单车！");
                return;
            }

            try
            {
                // 重新加载数据
                ds.Tables["shop11"].Clear();
                init();
                Bind();

                MessageBox.Show("还车成功！");
            }
            catch (Exception ex)
            {
                MessageBox.Show("还车过程中出现错误：" + ex.Message);
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                // 遍历 DataGridView 的每一行
                foreach (DataGridViewRow row in dgv.Rows)
                {
                    // 检查选择列是否被选中
                    DataGridViewCheckBoxCell checkBoxCell = row.Cells["acCode"] as DataGridViewCheckBoxCell;
                    if (checkBoxCell != null && checkBoxCell.Value != null && (bool)checkBoxCell.Value)
                    {
                        // 获取必要的信息
                        int bikeID = Convert.ToInt32(row.Cells["BikeID"].Value);
                        int qty = Convert.ToInt32(row.Cells["qty"].Value);
                        DateTime orderTime = DateTime.Parse(row.Cells["T"].Value.ToString());
                        decimal price = Convert.ToDecimal(row.Cells["jiage"].Value);

                        // 计算时间差，不足一小时按一小时计算
                        int totalHours = (DateTime.Now - orderTime).Hours;
                        if ((DateTime.Now - orderTime).Minutes > 0)
                        {
                            totalHours++; // 如果有分钟数，则小时数加一
                        }

                        // 计算费用
                        decimal cost = totalHours * qty * price;

                        // 构建 SQL 更新语句，包括更新 TT 列为当前时间
                        string updateSql = "UPDATE shop11 SET S = @cost, TT = @settlementTime WHERE BikeID = @bikeID AND shopid = @shopID";

                        // 使用 SqlCommand 执行 SQL 语句
                        using (SqlCommand cmd = new SqlCommand(updateSql, DB.cn))
                        {
                            // 添加参数并设置其值
                            cmd.Parameters.AddWithValue("@cost", cost);
                            cmd.Parameters.AddWithValue("@bikeID", bikeID);
                            cmd.Parameters.AddWithValue("@settlementTime", DateTime.Now); // 插入当前时间

                            // 假设 shopid 是购物车的唯一标识符
                            int shopID = Convert.ToInt32(row.Cells["shopid"].Value);
                            cmd.Parameters.AddWithValue("@shopID", shopID);

                            // 执行命令
                            int result = cmd.ExecuteNonQuery();

                            // 检查结果
                            if (result > 0)
                            {
                                // 可以在这里添加消息提示，例如费用更新成功
                            }
                        }
                    }
                }

                // 重新加载数据
                ds.Tables["shop11"].Clear();
                init();
                Bind();

                MessageBox.Show("费用计算并更新成功！");
            }
            catch (Exception ex)
            {
                // 显示错误消息
                MessageBox.Show("费用计算或更新过程中出错：" + ex.Message);
            }
        }
    }
}